package com.aop.aspect;

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

/**
 * @ClassDescription: 切面类
 * @JdkVersion: 1.8
 * @Author: 李白
 * @Created: 2024/12/29 14:53
 */
@Aspect
@Component
public class AspectJ {

    /**
     * 切点方法
     */
    @Pointcut(value = "execution(* com.aop.controller.*.*(..))")
    public void pointcut(){}

    /**
     * 返回通知
     * 注意，该方法的返回值类型需要根据你接口返回值类型定义，保持一致
     * @param result 接口返回参数
     */
    @AfterReturning(value = "pointcut()", returning = "result")
    public JSONObject afterReturning(JSONObject result){

        System.out.println("test1 ------> "+result);

        //获取所拦截的请求中的参数，校验后返回（如果校验失败，则更改返回值中的code为911，表示token校验失败）

        //获取请求参数
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        //获取请求头参数
        String username = request.getHeader("username");
        String userGroup = request.getHeader("userGroup");
        String token = request.getHeader("token");
        //获取请求参数
        String age = request.getParameter("age");
        String height = request.getParameter("height");

        //获取请求中的参数内容，这里的json结构getRequestJson只是为了查看获取的参数内容，并无实际意义，可忽略
//        JSONObject getRequestJson = new JSONObject();
//        getRequestJson.put("username",username);
//        getRequestJson.put("userGroup",userGroup);
//        getRequestJson.put("token",token);
//        getRequestJson.put("age",age);
//        getRequestJson.put("height",height);
//        System.out.println("拦截请求的参数内容------------》"+getRequestJson);

        //校验token数据，前提，在redis中存有token，登录接口被调用会生成一个token存入redis，校验时通过拿到的token与redis中的对比
        //这里假设redis中的token值为123456789abcd，具体redis存取参数的实现这里就不演示了
        String redisToken = "123456789abcd";

        //获取请求返回的数据，并且需要知道数据结构，根据结构拿到参数并修改
        if (redisToken.equals(token)){
            System.out.println("token一致，校验通过----------》");
            //token一致，校验通过，返回数据不变
            return result;
        }else{
            System.out.println("token不一致，校验失败，数据更改后返回");
            System.out.println("用户登录存储redis中的token："+redisToken+" \n"+"用户请求校验中拦截的token："+token);
            //token不一致，校验不通过，修改返回数据中的code码，将其修改为911，前端拦截获取code911则将页面跳转到登录界面
            result.put("code", 911);
            //这里不管之前有没有code参数，code是什么，使用put放入后都会变成现有的911
            return result;
        }

    }

}
